package com.wm;

/**
 * @ClassName:AbstractList
 * @Description: List集合的抽象类，抽取子类公共的实现方法
 * @Author:Deamer
 * @Date:2022/1/16 18:01
 **/
public abstract class AbstractList<E> implements List<E> {

    /**
     * 元素的数量
     */
    protected int size;

    /**
     * 元素的数量
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某个元素
     *
     * @return
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FIND;
    }

    /**
     * 添加元素到尾部
     *
     * @param element
     */
    public void add(E element) {
        add(size, element);
    }

    // 检查下标是否越界
    protected void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    // 检查下标是否越界，尾部添加，所以不加=
    protected void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

    // 数组下标越界报错
    protected void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("index:" + index + "size:" + size);
    }
}
